856d88
@@ -32,7 +32,7 @@
  */
 public class VectorGroupKeyHelper extends VectorColumnSetInfo {
 
-  private int[] outputColumnNums;
+  private int[] inputColumnNums;
 
   public VectorGroupKeyHelper(int keyCount) {
     super(keyCount);
@@ -44,13 +44,18 @@
void init(VectorExpression[] keyExpressions) throws HiveException {
     // case, we use the keyCount passed to the constructor and not keyExpressions.length.
 
     // Inspect the output type of each key expression.  And, remember the output columns.
-    outputColumnNums = new int[keyCount];
+    inputColumnNums = new int[keyCount];
     for(int i = 0; i < keyCount; ++i) {
       VectorExpression keyExpression = keyExpressions[i];
+
       TypeInfo typeInfo = keyExpression.getOutputTypeInfo();
       Type columnVectorType = VectorizationContext.getColumnVectorTypeFromTypeInfo(typeInfo);
       addKey(columnVectorType);
-      outputColumnNums[i] = keyExpression.getOutputColumnNum();
+
+      // The output of the key expression is the input column.
+      final int inputColumnNum = keyExpression.getOutputColumnNum();
+
+      inputColumnNums[i] = inputColumnNum;
     }
     finishAdding();
   }
@@ -64,10 +69,12 @@
void init(VectorExpression[] keyExpressions) throws HiveException {
    */
   public void copyGroupKey(VectorizedRowBatch inputBatch, VectorizedRowBatch outputBatch,
           DataOutputBuffer buffer) throws HiveException {
+
     for(int i = 0; i< longIndices.length; ++i) {
-      final int columnIndex = outputColumnNums[longIndices[i]];
-      LongColumnVector inputColumnVector = (LongColumnVector) inputBatch.cols[columnIndex];
-      LongColumnVector outputColumnVector = (LongColumnVector) outputBatch.cols[columnIndex];
+      final int outputColumnNum = longIndices[i];
+      final int inputColumnNum = inputColumnNums[outputColumnNum];
+      LongColumnVector inputColumnVector = (LongColumnVector) inputBatch.cols[inputColumnNum];
+      LongColumnVector outputColumnVector = (LongColumnVector) outputBatch.cols[outputColumnNum];
 
       // This vectorized code pattern says: 
       //    If the input batch has no nulls at all (noNulls is true) OR
@@ -91,9 +98,10 @@
public void copyGroupKey(VectorizedRowBatch inputBatch, VectorizedRowBatch outpu
       }
     }
     for(int i=0;i<doubleIndices.length; ++i) {
-      final int columnIndex = outputColumnNums[doubleIndices[i]];
-      DoubleColumnVector inputColumnVector = (DoubleColumnVector) inputBatch.cols[columnIndex];
-      DoubleColumnVector outputColumnVector = (DoubleColumnVector) outputBatch.cols[columnIndex];
+      final int outputColumnNum = doubleIndices[i];
+      final int inputColumnNum = inputColumnNums[outputColumnNum];
+      DoubleColumnVector inputColumnVector = (DoubleColumnVector) inputBatch.cols[inputColumnNum];
+      DoubleColumnVector outputColumnVector = (DoubleColumnVector) outputBatch.cols[outputColumnNum];
       if (inputColumnVector.noNulls || !inputColumnVector.isNull[0]) {
         outputColumnVector.vector[outputBatch.size] = inputColumnVector.vector[0];
       } else {
@@ -102,9 +110,10 @@
public void copyGroupKey(VectorizedRowBatch inputBatch, VectorizedRowBatch outpu
       }
     }
     for(int i=0;i<stringIndices.length; ++i) {
-      final int columnIndex = outputColumnNums[stringIndices[i]];
-      BytesColumnVector inputColumnVector = (BytesColumnVector) inputBatch.cols[columnIndex];
-      BytesColumnVector outputColumnVector = (BytesColumnVector) outputBatch.cols[columnIndex];
+      final int outputColumnNum = stringIndices[i];
+      final int inputColumnNum = inputColumnNums[outputColumnNum];
+      BytesColumnVector inputColumnVector = (BytesColumnVector) inputBatch.cols[inputColumnNum];
+      BytesColumnVector outputColumnVector = (BytesColumnVector) outputBatch.cols[outputColumnNum];
       if (inputColumnVector.noNulls || !inputColumnVector.isNull[0]) {
         // Copy bytes into scratch buffer.
         int start = buffer.getLength();
@@ -121,9 +130,10 @@
public void copyGroupKey(VectorizedRowBatch inputBatch, VectorizedRowBatch outpu
       }
     }
     for(int i=0;i<decimalIndices.length; ++i) {
-      final int columnIndex = outputColumnNums[decimalIndices[i]];
-      DecimalColumnVector inputColumnVector = (DecimalColumnVector) inputBatch.cols[columnIndex];
-      DecimalColumnVector outputColumnVector = (DecimalColumnVector) outputBatch.cols[columnIndex];
+      final int outputColumnNum = decimalIndices[i];
+      final int inputColumnNum = inputColumnNums[outputColumnNum];
+      DecimalColumnVector inputColumnVector = (DecimalColumnVector) inputBatch.cols[inputColumnNum];
+      DecimalColumnVector outputColumnVector = (DecimalColumnVector) outputBatch.cols[outputColumnNum];
       if (inputColumnVector.noNulls || !inputColumnVector.isNull[0]) {
 
         // Since we store references to HiveDecimalWritable instances, we must use the update method instead
@@ -135,9 +145,10 @@
public void copyGroupKey(VectorizedRowBatch inputBatch, VectorizedRowBatch outpu
       }
     }
     for(int i=0;i<timestampIndices.length; ++i) {
-      final int columnIndex = outputColumnNums[timestampIndices[i]];
-      TimestampColumnVector inputColumnVector = (TimestampColumnVector) inputBatch.cols[columnIndex];
-      TimestampColumnVector outputColumnVector = (TimestampColumnVector) outputBatch.cols[columnIndex];
+      final int outputColumnNum = timestampIndices[i];
+      final int inputColumnNum = inputColumnNums[outputColumnNum];
+      TimestampColumnVector inputColumnVector = (TimestampColumnVector) inputBatch.cols[inputColumnNum];
+      TimestampColumnVector outputColumnVector = (TimestampColumnVector) outputBatch.cols[outputColumnNum];
       if (inputColumnVector.noNulls || !inputColumnVector.isNull[0]) {
 
         outputColumnVector.setElement(outputBatch.size, 0, inputColumnVector);
@@ -147,9 +158,10 @@
public void copyGroupKey(VectorizedRowBatch inputBatch, VectorizedRowBatch outpu
       }
     }
     for(int i=0;i<intervalDayTimeIndices.length; ++i) {
-      final int columnIndex = outputColumnNums[intervalDayTimeIndices[i]];
-      IntervalDayTimeColumnVector inputColumnVector = (IntervalDayTimeColumnVector) inputBatch.cols[columnIndex];
-      IntervalDayTimeColumnVector outputColumnVector = (IntervalDayTimeColumnVector) outputBatch.cols[columnIndex];
+      final int outputColumnNum = intervalDayTimeIndices[i];
+      final int inputColumnNum = inputColumnNums[outputColumnNum];
+      IntervalDayTimeColumnVector inputColumnVector = (IntervalDayTimeColumnVector) inputBatch.cols[inputColumnNum];
+      IntervalDayTimeColumnVector outputColumnVector = (IntervalDayTimeColumnVector) outputBatch.cols[outputColumnNum];
       if (inputColumnVector.noNulls || !inputColumnVector.isNull[0]) {
 
         outputColumnVector.setElement(outputBatch.size, 0, inputColumnVector);
